<?php

namespace app\admin\model\scanwork;

use think\Model;

class QualityWorkflow extends Model
{
    // 表名
    protected $name = 'scanwork_quality_workflow';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = false;

    // 追加属性
    protected $append = [
        'status_flow_array',
    ];

    /**
     * 获取状态流转数组
     */
    public function getStatusFlowArrayAttr($value, $data)
    {
        $statusFlow = $this->status_flow;
        if (is_string($statusFlow)) {
            return json_decode($statusFlow, true);
        }
        return $statusFlow ?: [];
    }

    /**
     * 获取标准质检工作流
     */
    public static function getStandardWorkflow()
    {
        return self::where('is_active', 1)
            ->where('workflow_name', '标准质检流程')
            ->find();
    }

    /**
     * 获取状态流转信息
     */
    public function getStatusFlow($status)
    {
        $statusFlow = $this->getStatusFlowArrayAttr(null, $this->getData());
        return isset($statusFlow[$status]) ? $statusFlow[$status] : null;
    }

    /**
     * 获取下一状态
     */
    public function getNextStatus($currentStatus, $action)
    {
        $statusFlow = $this->getStatusFlow($currentStatus);
        if (!$statusFlow) {
            return null;
        }

        $nextStatuses = $statusFlow['next'] ?? [];
        $actions = $statusFlow['actions'] ?? [];

        // 根据动作确定下一状态
        switch ($action) {
            case '质检通过':
                return '0'; // 待审核
            case '质检失败':
                return '2'; // 已拒绝
            case '审核通过':
                return '1'; // 已确认
            case '审核拒绝':
                return '2'; // 已拒绝
            case '重新报工':
                return '-1'; // 待质检
            default:
                return null;
        }
    }

    /**
     * 验证状态流转是否合法
     */
    public function validateStatusTransition($fromStatus, $toStatus, $action)
    {
        $statusFlow = $this->getStatusFlow($fromStatus);
        if (!$statusFlow) {
            return false;
        }

        $nextStatuses = $statusFlow['next'] ?? [];
        $actions = $statusFlow['actions'] ?? [];

        // 检查目标状态是否在允许的下一状态中
        if (!in_array($toStatus, $nextStatuses)) {
            return false;
        }

        // 检查动作是否合法
        if (!in_array($action, $actions)) {
            return false;
        }

        return true;
    }

    /**
     * 获取状态描述
     */
    public function getStatusDescription($status)
    {
        $statusFlow = $this->getStatusFlow($status);
        return $statusFlow ? $statusFlow['desc'] : '未知状态';
    }

    /**
     * 获取状态名称
     */
    public function getStatusName($status)
    {
        $statusFlow = $this->getStatusFlow($status);
        return $statusFlow ? $statusFlow['name'] : '未知';
    }

    /**
     * 获取可执行的动作
     */
    public function getAvailableActions($status)
    {
        $statusFlow = $this->getStatusFlow($status);
        return $statusFlow ? ($statusFlow['actions'] ?? []) : [];
    }
}
